﻿using System;
using System.Data;
using System.Collections.Generic;
using System.Collections;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Text.RegularExpressions;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Criterion;

/// <summary>
/// Summary description for PropuestaControl
/// </summary>
public class PropuestaControl
{
    protected IList<Propuesta> propuestas;


	public PropuestaControl()
	{
		
	}
    /// <summary>
    /// Busca todas la propuestas mediante el uso de nhibernate.
    /// 
    /// Autor: Equipo # 1
    /// </summary>
    /// <returns> una lista generica con todas las propuestas </returns>
    protected IList<Propuesta> recolectarPropuesta()
    {
        ISession session = NHibernateControl.GetCurrentSession();
        return  session.CreateCriteria(typeof(Propuesta)).List<Propuesta>();
        session.Flush();
        NHibernateControl.CloseSession();
    }


    /// <summary>
    /// Nombre del metodo: BusquedaPropuesta
    /// En este metodo se reciben los datos necesarios para buscar una propuesta
    /// dentro del sistema,estos datos provienen de la clase BuscarPropuesta.aspx.cs,
    /// los parametros recibidos son utilizados para crear dos variables de los tipo
    /// recibidos(par,busq).
    /// Seguidamen se aplico un switch que recibiria
    /// como parametro la variable "par" el cual se encargaria de verificar que lo 
    /// introducido por el usuario en el campo de texto (ademas de ser consistente con lo 
    /// seleccionado por el usuario en el DropDownList1) en la base de datos para buscar 
    /// coincidencias.
    /// </summary>
    ///
    /// <param name="nombre"> string parametro,string bus
    /// 
    /// </param>
    ///
    /// <returns> Este metodo devuelve la lista de propuestas encontardas </returns>
    ///
    /// <pre> la propuesta debe estar registrada en el sistema</pre>
    ///
    /// <pos> se arrojan las propuestas encontradas en la base de datos y de no haber
    /// coincidencia se arroja un mensaje donde se indica que la propuesta no fue encontrada
    /// </pos>
    public IList<Propuesta> BusquedaPropuesta(string parametro, string bus)
    {
        string par = parametro;
        string busq = bus;
        IList<Propuesta> lista = null;
        ISession session = NHibernateControl.GetCurrentSession();
        ITransaction tx = session.BeginTransaction();

        ICriteria miCriteria = session.CreateCriteria(typeof(Propuesta));

        switch (par)
        {
            case "Codigo":
                string codigo = busq;
                miCriteria.Add(Expression.Eq("Codigo", codigo));
                break;

            case "Titulo":
                string titulo = busq;
                miCriteria.Add(Expression.Eq("Titulo", titulo));
                break;

            case "Version":
                try
                {
                    double version = double.Parse(busq);
                    miCriteria.Add(Expression.Eq("Version", version));
                    break;
                }
                catch (Exception ex)
                {
                    throw new ApplicationException ("version");    
                }

            case "Cliente":
                string cliente = busq;
                miCriteria.Add(Expression.Eq("Cliente", cliente));
                break;

            case "Nombre del Receptor":
                string nombreReceptor = busq;
                miCriteria.Add(Expression.Eq("NombreReceptor", nombreReceptor));
                break;

            case "Apellido del Receptor":
                string apellidoReceptor = busq;
                miCriteria.Add(Expression.Eq("ApellidoReceptor", apellidoReceptor));
                break;

            case "Cargo del Receptor":
                string cargoReceptor = busq;
                miCriteria.Add(Expression.Eq("CargoReceptor", cargoReceptor));
                break;

            case "Fecha de Propuesta":
                try
                {
                    string fechaPropuesta = busq;

                    miCriteria.Add(Expression.Eq("Fecha", DateTime.Parse(fechaPropuesta)));
                    break;
                }
                catch (Exception ex)
                {
                    throw new ApplicationException("fecha");
                }

        }


        lista = miCriteria.List<Propuesta>();


        //if (lista != null)
        //{


        //    GridView1.DataSource = lista;
        //    GridView1.DataBind();

        //}

        tx.Commit();
        return lista;
    }


    /// <summary>
    /// Modifica la propuesta en la base de datos.
    /// </summary>
    /// <param name="propuesta"> Recibe la propuesta con los datos ya modificados.</param>
    public void ModificarPropuesta(Propuesta propuesta)
    {
        ISession session = NHibernateControl.GetCurrentSession();
        ITransaction tx = session.BeginTransaction();

        session.Update(propuesta);

        tx.Commit();
        NHibernateControl.CloseSession();
    }

    // <summary>
    //Metodo que se encarga de buscar una propuesta  de la lista de Propuestas segun el codigo
    //que retorna del metodo GetPropuesta.(Grupo 5)
    //Parametro de busqueda: String con el Id de la Propuesta que se desea buscar 
    // </summary>

    public Propuesta BuscarPropuestaCodigo(String query)
    {

        IList propuestas = (IList)this.recolectarPropuesta();
        Propuesta resultado = new Propuesta();
        resultado = null;
        foreach (Propuesta propuesta in propuestas)
        {
            if (propuesta.Codigo == query)
                resultado = propuesta;
        }
        return resultado;
    }
    // <summary>
    //Metodo que se encarga de buscar una propuesta de la lista de Propuestas segun el Id
    //que retorna del metodo GetPropuesta.(Grupo 5)
    //Parametro de busqueda: String con el Id de la Propuesta que se desea buscar 
    // </summary>

    public Propuesta BuscarPropuestaId(String query)
    {

        IList propuestas =(IList) this.recolectarPropuesta();
        Propuesta resultado = new Propuesta();
        resultado = null;
        foreach (Propuesta propuesta in propuestas)
        {
            if (propuesta.Id == int.Parse(query))
                resultado = propuesta;
        }
        return resultado;
    }

    public void IngresarPropuesta(Propuesta propuesta) {
        ISession session = NHibernateControl.GetCurrentSession();
        ITransaction tx = session.BeginTransaction();

        session.Save(propuesta);

        tx.Commit();
        NHibernateControl.CloseSession();
    }
    
    
    public IList<Propuesta> GetPropuestas 
    {
        get { return propuestas = recolectarPropuesta(); }
    }

    

}
